package cn.tedu.springdemo.day04;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 测试类
 */
public class Test01 {
    /**
     * 单例模式:容器初始化过程中创建对象将对象保存到Map中获取Bean
     * 本质上从Map中查找并且获取对象，所以，每次都获取的是同一个Bean
     *
     * 多例模式：容器初始化过程中，不创建对象，是在每次获取Bean的时候创建对象
     * 并且返回对象，且对象不会保存在Map中，每次创建新对象
     *
     * 1.xml---找到Bean标签---添加scope="prototype"完成
     */
    @Test
    public void test01() {
        //1.创建容器--扫描Bean id 反射创建新对象（调用无参数构造器）--Map保存
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext8.xml");
        //2.获取Bean---单例模式(设置懒加载：并不是容器时创建的，而是输出时候创建)
        Person p = (Person) ac.getBean("person");
        System.out.println(p);
        Person p1 = (Person) ac.getBean("person");//不影响单例--延时
        System.out.println(p1);
        //3.关闭容器
        ((ClassPathXmlApplicationContext) ac).close();
    }
        /**
         *多例模式
         Person构造器...
         cn.tedu.springdemo.day04.Person@7a9273a8
         Person构造器...
         cn.tedu.springdemo.day04.Person@26a7b76d
         *单例模式
         *Person构造器...
         * cn.tedu.springdemo.day04.Person@45820e51
         * cn.tedu.springdemo.day04.Person@45820e51
         *
         * 实际开发中单例多--每次都会从Map中找到对象并且返回--项目大Bean多（项目卡）
         * 实际加载过程中--不是所有Bean都会需要被执行
         * 懒加载（重要）
         */
        //懒加载（重要）--解决单例模式使用过多的情况（解决内存消耗）！
        //假设：applicationContext.xml--大量bean---指定都是懒加载，个别不设置
    @Test
    public void test02(){
        //1.创建容器--扫描Bean id 反射创建新对象（调用无参数构造器）--Map保存
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext9.xml");
        //2.获取Bean---单例模式
        Tom p = (Tom) ac.getBean("tom");
        System.out.println(p);
        Tom p1 = (Tom) ac.getBean("tom");
        System.out.println(p1);
        //3.关闭容器
        ((ClassPathXmlApplicationContext) ac).close();
    }

}
